package br.com.petsis.funcionalidades.manterServico;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.EntityManager;

import org.hibernate.mapping.Array;
import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.faces.FacesMessages;
import org.jboss.seam.international.StatusMessage.Severity;

import br.com.petsis.entity.Empresa;
import br.com.petsis.entity.Servico;

@Name("manterServicoController")
@Scope(ScopeType.CONVERSATION)
//@Restrict(value="#{identity.hasRole('Administrador')}")
public class ManterServicoController {
	
	private static final String QRY_SERVICOS = "select s.id_servico,s.dsc_nome,s.vlr_servico from servico s where s.id_empresa = :idEmpresa and s.flg_ativo = 'T' order by s.dsc_nome";

	@In(create=true)
	private EntityManager entityManager;
	
	private List<Servico> listaServicos;
	
	private boolean selecionadoTodos;

	private Servico servicoEdicao;
	
	private String filtroNome;
	
	private String filtroValor;
	
	@In(required=false)
	private Empresa empresaSessao;
	
	public String getFiltroNome() {
		return filtroNome;
	}

	public void setFiltroNome(String filtroNome) {
		this.filtroNome = filtroNome;
	}

	public String getFiltroValor() {
		return filtroValor;
	}

	public void setFiltroValor(String filtroValor) {
		this.filtroValor = filtroValor;
	}

	public boolean filtrarServicoPorNome(Object current){
		Servico servico = (Servico)current;
		if(getFiltroNome() == null || getFiltroNome().isEmpty()){
			return true;
		}
		if(servico.getDscNome().toLowerCase().contains(getFiltroNome().toLowerCase())){
			return true;
		}else{
			return false;
		}
	}
	
	public boolean filtrarServicoPorValor(Object current){
		Servico servico = (Servico)current;
		if(getFiltroValor() == null || getFiltroValor().isEmpty()){
			return true;
		}
		if(servico.getVlrServico().toString().toLowerCase().startsWith(getFiltroValor().replace(",", ".").toLowerCase())){
			return true;
		}else{
			return false;
		}
	}

	public String novo(){
		return "novo";
	}
	
	public void onLoad(){
		
	}
	
	public void onLoadList(){
		setListaServicos(null);
		servicoEdicao = new Servico();
	}
	
	public String editar(Servico servico){
		servicoEdicao = entityManager.find(Servico.class, servico.getIdServico());
		return "editar";
	}
	
	public String cancelar(){
		return "voltar";
	}
	
	public String salvar(){
		if(empresaSessao == null){
			FacesMessages.instance().add(Severity.ERROR,"Somente empresas podem salvar serviços.");
			return null;
		}
		getServicoEdicao().setFlgAtivo('T');
		getServicoEdicao().setEmpresa(empresaSessao);
		entityManager.merge(getServicoEdicao());
		entityManager.flush();
		FacesMessages.instance().add(Severity.INFO,"Serviço salvo com sucesso.");
		return "persisted";
	}

	public Servico getServicoEdicao() {
		if (servicoEdicao == null) {
			servicoEdicao = new Servico();
		}
		return servicoEdicao;
	}

	public void setServicoEdicao(Servico servicoEdicao) {
		this.servicoEdicao = servicoEdicao;
	}

	public List<Servico> getListaServicos() {
		if (listaServicos == null) {
			listaServicos = new ArrayList<Servico>();
			if(empresaSessao != null){
				List<Object[]> lista = entityManager.createNativeQuery(QRY_SERVICOS)
					.setParameter("idEmpresa", empresaSessao.getIdEmpresa())
					.getResultList(); 
				Servico s;
				for(Object[] o : lista){
					s = new Servico();
					s.setIdServico(Integer.parseInt(o[0].toString()));
					s.setDscNome(o[1] != null ? o[1].toString() : null);
					s.setVlrServico(o[2] != null ? Float.parseFloat(o[2].toString()) : null);
					listaServicos.add(s);
				}
			}
		}
		return listaServicos;
	}

	public void setListaServicos(List<Servico> listaServicos) {
		this.listaServicos = listaServicos;
	}
	
	public void excluir(){
		List<Servico> listaRemocao = new ArrayList<Servico>();
		for(Servico s : getListaServicos()){
			if(s.isSelecionado()){
				s.setFlgAtivo('F');
				entityManager.merge(s);
				listaRemocao.add(s);
			}
		}
		entityManager.flush();
		getListaServicos().removeAll(listaRemocao);
	}

	public void selecionaTodos(){
		for(Servico s : getListaServicos()){
			if(isSelecionadoTodos()){
				s.setSelecionado(true);
			}else{
				s.setSelecionado(false);	
			}
		}
	}
	
	public boolean isSelecionadoTodos() {
		return selecionadoTodos;
	}

	public void setSelecionadoTodos(boolean selecionadoTodos) {
		this.selecionadoTodos = selecionadoTodos;
	}
	
	
}
